import request from "@/utils/request";
import { downloadFileByData } from "@/utils/download";

/**
 * 租户客户状态配置 实体类型定义
 * 
 * @author guagua
 * @date 2025-01-04
 */
export interface TenantCustomerStatusModel {
    /** 主键ID */
    id?: string;

    /** 状态编码 */
    statusCode?: string;

    /** 状态名称 */
    statusName?: string;

    /** 状态类型 */
    statusType?: string;

    /** 父级状态类型 */
    parentType?: string;

    /** 状态颜色 */
    statusColor?: string;

    /** 排序号 */
    sortOrder?: number;

    /** 是否系统内置 */
    isSystem?: number;

    /** 是否启用 */
    isActive?: number;

    /** 备注 */
    remark?: string;

    /** 父级主键集合 */
    orgIds?: string;

    /** 创建者 */
    createBy?: string;

    /** 创建时间 */
    createTime?: string;

    /** 修改人 */
    updateBy?: string;

    /** 修改时间 */
    updateTime?: string;

    /** 乐观锁 */
    version?: number;
}

/**
 * 分页查询参数类型
 * 可以自己加参数，但是不要修改已有的参数
 */
export interface TenantCustomerStatusQueryParams {
    /** 页码 */
    pageNo?: number;

    /** 每页条数 */
    pageSize?: number;

    /** 状态编码 */
    statusCode_LIKE?: string;

    /** 状态名称 */
    statusName_LIKE?: string;

    /** 状态类型 */
    statusType_EQ?: string;

    /** 父级状态类型 */
    parentType_EQ?: string;

    /** 是否启用 */
    isActive_EQ?: number;

    /** 排序字段 */
    orderBy?: string;

    /** 排序方式 */
    sortOrder?: 'asc' | 'desc';

    /** 排序字段 */
    sortOrder_ORDER?: string;
}

/**
 * API 响应类型
 */
export interface ApiResponse<T = any> {
    code: number;
    msg: string;
    data: T;
    timestamp: number;
}

/**
 * 分页响应数据类型
 */
export interface PageResult<T> {
    rows: T[];
    total: number;
    size: number;
    current: number;
    pages: number;
}

/**
 * 获取客户状态配置分页列表
 * @param params 查询参数
 * @returns Promise<ApiResponse<PageResult<TenantCustomerStatusModel>>>
 */
export function getList(params: TenantCustomerStatusQueryParams): Promise<ApiResponse<PageResult<TenantCustomerStatusModel>>> {
    return request({
        url: "/api/v1/tenant/customerstatus/findPage",
        method: "get",
        params,
    });
}

/**
 * 获取所有有效状态列表
 * @returns Promise<ApiResponse<TenantCustomerStatusModel[]>>
 */
export function getAllActive(): Promise<ApiResponse<TenantCustomerStatusModel[]>> {
    return request({
        url: "/api/v1/tenant/customerstatus/findAll",
        method: "get",
    });
}

/**
 * 根据ID获取客户状态配置
 * @param id 主键ID
 * @returns Promise<ApiResponse<TenantCustomerStatusModel>>
 */
export function getById(id: string): Promise<ApiResponse<TenantCustomerStatusModel>> {
    return request({
        url: "/api/v1/tenant/customerstatus/get",
        method: "get",
        params: { id },
    });
}

/**
 * 新增客户状态配置
 * @param data 新增数据
 * @returns Promise<ApiResponse<TenantCustomerStatusModel>>
 */
export function doInsert(data: Partial<TenantCustomerStatusModel>): Promise<ApiResponse<TenantCustomerStatusModel>> {
    return request({
        url: "/api/v1/tenant/customerstatus/insert",
        method: "post",
        data,
    });
}

/**
 * 更新客户状态配置
 * @param data 更新数据
 * @returns Promise<ApiResponse<TenantCustomerStatusModel>>
 */
export function doUpdate(data: TenantCustomerStatusModel): Promise<ApiResponse<TenantCustomerStatusModel>> {
    return request({
        url: "/api/v1/tenant/customerstatus/update",
        method: "post",
        data,
    });
}

/**
 * 删除客户状态配置
 * @param params 删除参数
 * @returns Promise<ApiResponse<boolean>>
 */
export function doDelete(params: { id: string }): Promise<ApiResponse<boolean>> {
    return request({
        url: "/api/v1/tenant/customerstatus/del",
        method: "post",
        params,
    });
}

/**
 * 批量删除客户状态配置
 * @param params 批量删除参数
 * @returns Promise<ApiResponse<boolean>>
 */
export function doDeleteAll(params: { ids: string }): Promise<ApiResponse<boolean>> {
    return request({
        url: "/api/v1/tenant/customerstatus/delAll",
        method: "post",
        params,
    });
}

/**
 * 导出Excel
 * @param params 导出参数
 * @returns Promise<void>
 */
export async function doExportExcel(params: TenantCustomerStatusQueryParams): Promise<void> {
    const authURL = "/api/v1/tenant/customerstatus/excel/auth/export";
    const downloadURL = "/api/v1/tenant/customerstatus/excel/export/";

    try {
        // 认证
        const response: ApiResponse<string> = await request({
            url: authURL,
            method: "get",
            params,
        });

        if (response.data) {
            // 下载文件
            downloadFileByData(downloadURL + response.data, params);
        }
    } catch (error) {
        console.error('导出Excel失败:', error);
        throw error;
    }
}

/**
 * 下载导入模版
 * @returns Promise<void>
 */
export async function doDownloadTemplate(): Promise<void> {
    const authURL = "/api/v1/tenant/customerstatus/excel/auth/import-template-export";
    const downloadURL = "/api/v1/tenant/customerstatus/excel/export/";

    try {
        // 认证
        const response: ApiResponse<string> = await request({
            url: authURL,
            method: "get",
        });

        if (response.data) {
            // 下载文件
            downloadFileByData(downloadURL + response.data, {});
        }
    } catch (error) {
        console.error('下载模版失败:', error);
        throw error;
    }
}

/**
 * 导入Excel
 * @param data 表单数据
 * @returns Promise<ApiResponse<any>>
 */
export function doImportExcel(data: FormData): Promise<ApiResponse<any>> {
    return request({
        url: "/api/v1/tenant/customerstatus/importExcel",
        method: "post",
        data,
        headers: {
            'Content-Type': 'multipart/form-data'
        }
    });
} 